#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;

int main(int argc, char** argv) {
    cv::Mat src1, src2, diff12;
    if (argc < 3) {
        cout << "parameters miss!\n"
            << argv[0] << " 1.jpg 2.jpg" << endl;
        return -1;
    }

    src1 = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
    src2 = cv::imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);

    // a
    cv::absdiff(src1, src2, diff12);
    cv::imshow("absdiff", diff12);

    // b
    cv::Mat diff_thresh, mop_open, dst, dst2, kernel;
    // cv::threshold(diff12, diff_thresh, 30, 255, cv::THRESH_BINARY);
    cv::threshold(diff12, diff_thresh, 100, 255, cv::THRESH_OTSU);
    cv::imshow("thresh", diff_thresh);

    // cexer
    kernel = cv::getStructuringElement(cv::MORPH_OPEN, cv::Size(3,3));
    cv::morphologyEx(diff_thresh, mop_open, cv::MORPH_OPEN, kernel);
    cv::imshow("open", mop_open);

    // d
    cv::erode(mop_open, dst, cv::Mat());
    cv::imshow("erode", dst);
    src2.copyTo(dst2, dst);
    // cv::bitwise_xor(dst, mop_open, dst);
    cv::imshow("dst", dst2);
    cv::waitKey(0);
    return 0;
}